package top.yangbuyi.controller.system;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import top.yangbuyi.acpect.annotaction.Log;
import top.yangbuyi.acpect.enums.BusinessType;
import top.yangbuyi.dto.RoleDto;
import top.yangbuyi.service.impl.RoleService;
import top.yangbuyi.utils.ShiroSecurityUtils;
import top.yangbuyi.vo.AjaxResult;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;


/**
 * @description: 杨不易网站:www.yangbuyi.top
 * @program: yangbuyiopenHis2020
 * @ClassName: RoleController
 * @create: 2020-08-29 19:45
 * @author: yangbuyi
 * @since： JDK1.8
 * @RoleController: 角色控制器$ 角色控制器
 **/

@RestController
@Slf4j
@RequestMapping("system/role")
public class RoleController {

	  @Autowired
	  private RoleService roleService;

	  /**
	   * @功能描述: 角色分页查询
	   * @Author: TeouBle
	   * @Date: 2020/8/29 19:50
	   */
	  @GetMapping("listRoleForPage")
	  public AjaxResult listForPage(RoleDto roleDto) {
			return AjaxResult.success(roleService.listRolePage(roleDto));
	  }

	  /**
	   * @功能描述:查询所有可用的角色
	   * @Author: TeouBle
	   * @Date: 2020/8/29 20:02
	   */
	  @GetMapping("selectAllRole")
	  public AjaxResult selectAllRoleStatusTrue() {
			return AjaxResult.success(this.roleService.listAllRoles());
	  }

	  /**
	   * @功能描述: 角色添加
	   * @Author: TeouBle
	   * @Date: 2020/8/29 19:50
	   */
	  @PostMapping("addRole")
	  @Log(title = "角色添加", businessType = BusinessType.INSERT)
	  public AjaxResult addRole(@Validated RoleDto roleDto) {
			// 设置添加人员
			roleDto.setSimpleUser(ShiroSecurityUtils.getCurrentSimpleUser());
			return AjaxResult.toAjax(this.roleService.addRole(roleDto));
	  }

	  /**
	  * @功能描述:保存角色和菜单之间的关系
	  * @Description:
	  * @Author: TeouBle
	  * @Date: 2020/9/7 21:27
	  */
	  @PostMapping("saveRoleMenu/{roleId}/{menuIds}")
	  @Log(title = "保存角色和菜单之间的关系",businessType = BusinessType.INSERT)
	  public AjaxResult saveRoleMenu(@PathVariable Long roleId, @PathVariable Long[] menuIds) {
			/**
			 * @思路：因为我们用的路径参数，前端可能传递来的menuId为null，但是为空的话，无法匹配访问，所以我们在前端进行判断是否为空，传递一个-1我们进行判断这个-1表示一个权限没有选中
			 */
			if (menuIds.length == 1 && menuIds[0].equals(-1L)) {
			  menuIds = new Long[]{};
			}
			// 开始保存逻辑
			this.roleService.saveRoleMenu(roleId,menuIds);
			return AjaxResult.success();
	  }

	  /**
	   * 根据用户ID查询用户拥有的角色IDS
	   * @param userId
	   * @return
	   */
	  @GetMapping("getRoleIdsByUserId/{userId}")
	  public AjaxResult getRoleIdsByUserId(@PathVariable Long userId){
			List<Long> roleIds=this.roleService.getRoleIdsByUserId(userId);
			return AjaxResult.success(roleIds);
	  }

	  /**
	   * 保存角色和用户的关系
	   */
	  @PostMapping("saveRoleUser/{userId}/{roleIds}")
	  public AjaxResult saveRoleUser(@PathVariable Long userId,@PathVariable Long[] roleIds){
			/**
			 * 因为我们用的路径参数，前端可能传过来的roleIds是一个空的，但是为空的话无法匹配上面的路径
			 * 所以如果为空，我们让前端传一个-1过来，如果是-1说明当前角色一个权限也没有选择
			 */
			if(roleIds.length==1&&roleIds[0].equals(-1L)){
				  roleIds=new Long[]{};
			}
			this.roleService.saveRoleUser(userId, roleIds);
			return AjaxResult.success();
	  }


	  /**
	   * @功能描述: 角色修改
	   * @Author: TeouBle
	   * @Date: 2020/8/29 19:50
	   */
	  @PutMapping("updateRole")
	  @Log(title = "角色修改", businessType = BusinessType.UPDATE)
	  public AjaxResult updateRole(@Validated RoleDto roleDto) {
			try {
				  // 设置修改人员
				  roleDto.setSimpleUser(ShiroSecurityUtils.getCurrentSimpleUser());
				  return AjaxResult.toAjax(this.roleService.updateRole(roleDto));
			} catch (Exception e) {
				  return AjaxResult.ex(e.getMessage());
			}
	  }

	  /**
	   * @功能描述: 根据ID查询一个角色信息
	   * @Author: TeouBle
	   * @Date: 2020/8/29 20:02
	   */
	  @GetMapping("getRoleById/{roleid}")
	  @Log(title = "根据ID查询一个角色信息", businessType = BusinessType.SELECT)
	  public AjaxResult getRoleByID(@NotNull(message = "角色ID不能为空") @PathVariable @Validated Long roleid) {
			try {
				  return AjaxResult.success(this.roleService.getOne(roleid));
			} catch (Exception e) {
				  return AjaxResult.ex(e.getMessage());
			}
	  }

	  /**
	   * @功能描述:删除
	   * @Author: TeouBle
	   * @Date: 2020/8/29 20:02
	   */
	  @DeleteMapping("deleteRoleByIds/{roleIds}")
	  @Log(title = "根据ID删除角色", businessType = BusinessType.DELETE)
	  public AjaxResult updateRole(@PathVariable @Validated @NotEmpty(message = "要删除的角色ID不能为空") Long[] roleIds) {
			try {
				  return AjaxResult.toAjax(this.roleService.deleteRoleByIds(roleIds));
			} catch (Exception e) {
				  return AjaxResult.ex(e.getMessage());
			}
	  }


}
